package com.sxr.spring.file;

import com.sxr.file.FileRequest;
import com.sxr.file.impl.AbstractFileHandler;
import com.sxr.file.impl.FileInfo;
import com.sxr.integration.TenantContext;
import com.sxr.integration.tenant.TenantConfigProvider;

import java.io.File;
import java.io.InputStream;
import java.nio.file.Files;

import static com.sxr.signature.util.UrlUtil.urlDecode;

/**
 * 默认文件处理器实现
 * 支持本地文件系统的文件下载和预览
 * 继承AbstractFileHandler，专注于文件读写逻辑
 * 零第三方依赖，仅使用JDK8标准库
 *
 * @author SXR
 * @since 1.0.0
 */
public class DefaultFileHandler extends AbstractFileHandler {
    private final TenantConfigProvider tenantConfigProvider;

    public DefaultFileHandler(TenantConfigProvider tenantConfigProvider) {
        this.tenantConfigProvider = tenantConfigProvider;
    }

    @Override
    protected FileInfo getFileInfo(FileRequest request) {
        try {
            // 构建完整文件路径
            String fullPath = buildFullPath(request);
            if(fullPath == null) return null;

            // 检查文件是否存在
            File file = new File(fullPath);
            if (!file.exists() || !file.isFile()) {
                return null;
            }

            // 构建文件信息
            FileInfo fileInfo = new FileInfo();
            fileInfo.setFileName(request.getFileName() != null ? request.getFileName() : file.getName());
            fileInfo.setFileSize(file.length());
            fileInfo.setLastModified(file.lastModified());
            fileInfo.setFilePath(fullPath);
            fileInfo.setOther(file);

            return fileInfo;

        } catch (Exception e) {
            throw new RuntimeException("getFileInfo fail",e);
        }
    }

    @Override
    protected boolean checkFilePermission(FileRequest request, FileInfo fileInfo) {
        File file = (File) fileInfo.getOther();
        // 检查文件是否可读
        return file.canRead();
    }
    @Override
    protected InputStream readFileContent(FileRequest request, FileInfo fileInfo) {
        try {
            File file = (File) fileInfo.getOther();
            return Files.newInputStream(file.toPath());
        } catch (Exception e) {
            throw new RuntimeException("readFileContent fail",e);
        }
    }

    /**
     * 构建完整文件路径
     */
    private String buildFullPath(FileRequest request) {
        String tenantId = request.getTenantId();
        if (tenantId != null) {
            // 获取租户的基础路径
            TenantContext tenantContext = tenantConfigProvider.getTenantContext(tenantId);
            if(tenantContext == null) return null;
            // 简化实现，实际项目中从配置中获取
            String baseDir = tenantContext.getBasePath();
            // 获得对应的路径
//            return baseDir + File.separator  + request.getFilePath();  // 让他去配置
            String filePath = request.getFilePath();
            filePath = urlDecode(filePath);
            return baseDir + filePath.replaceAll("/",File.separator); // windows bug。
        }else{
            // 不支持单租户的模式。
            // 直接就必须是多租户的形式。
            return null;
        }
    }

}
